java 并发001

CSA原理

  CAS,(Compare-And-Swap,比较和替换)。其具有三个操作数:内存地址V,旧的预期值A,新的预期值B。当V中的值和A相同时,则用新值B替换V中的值,否则不执行更新。(PS:上述的操作是原子性的,因为过程是:要么执行更新,要么不更新),这个操作是CPU内部执行的,是原子的。类sun.misc.Unsafe提供了大量cas操作的方法。

不同类型的锁

阻塞锁

  让线程进入阻塞状态,等待唤醒信号,唤醒后才可以进入到就绪状态,通过竞争,进入运行状态。支持阻塞锁的方法有,synchronized关键字,ReentrantLock的lock和unlock方法,以及Object类的wait和notify方法。

自旋锁

  当一个线程获取锁时,但是锁被其他线程获取了,该线程就不断自循环来不断获取锁。

非公平锁

  1.当有线程竞争锁时,该线程会优先尝试获得锁,这对那些已经在队列等待的线程来说不公平,这就是不公平锁,但是会极大的提高性能。如果没有获取到锁,那么就会添加到对列尾部。

AQS

  AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点(Node)来实现锁的分配。